﻿//合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。
//数据范围：节点总数0≤n≤5000，每个节点的val满足∣val∣ <= 1000
//要求：时间复杂度O(nlogn)
//
//输入：
//	[{1, 2, 3}, { 4,5,6,7 }]
//返回值：
//	{ 1,2,3,4,5,6,7 }
//
//输入：
//	[{1, 2}, { 1,4,5 }, { 6 }]
//返回值：
//	{ 1,1,2,4,5,6 }

/**
 * struct ListNode {
 * int val;
 * struct ListNode *next;
 * ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
    struct cmp {
        bool operator()(ListNode* l1, ListNode* l2) {
            return l1->val > l2->val;
        }
    };
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        priority_queue<ListNode*, vector<ListNode*>, cmp> heap; // ⼩根堆
        for (auto head : lists) {
            if (head != nullptr) {
                heap.push(head);
            }
        }
        ListNode* ret = new ListNode(0);
        ListNode* prev = ret;
        while (heap.size()) {
            ListNode* t = heap.top();
            heap.pop();
            prev = prev->next = t;
            if (t->next != nullptr) {
                heap.push(t->next);
            }
        }
        return ret->next;
    }
};










